// 自动忽略
const data = {
  a: 'test1',
  b: undefined,
  c: Symbol('test2'),
  fn: function () {
    return true;
  },
};

console.log(JSON.stringify(data)); // {"a":"test1"}

// 数组返回null
const data2 = [
  'test1',
  undefined,
  function aa() {
    return true;
  },
  Symbol('test'),
];
console.log(JSON.stringify(data2)); // ["test1",null,null,null]

// 返回undefined
const a1 = JSON.stringify(function a() {
  console.log('test');
});
console.log('a1 = ' + a1); // a1 = undefined

const a2 = JSON.stringify(undefined);
console.log('a2 = ' + a2); // a2 = undefined

const a3 = JSON.stringify(Symbol('test'));
console.log('a3 = ' + a3); // a3 = undefined

// Date
console.log(JSON.stringify({ now: new Date() })); // {"now":"2023-06-27T08:53:19.740Z"}

// NaN 和 Infinity 以及 null
console.log(JSON.stringify(NaN)); // null
console.log(JSON.stringify(Infinity)); // null
console.log(JSON.stringify(null)); // null

// 转换为对应的原始值
console.log(
  JSON.stringify([new Number(2), new String('test'), new Boolean(false)])
); // [2,"test",false]

// 仅序列化可枚举属性
const obj = JSON.stringify(
  Object.create(null, {
    test1: { value: 'test1', enumerable: false },
    test2: { value: 'test2', enumerable: true },
  })
);
console.log(obj); // {"test2":"test2"}

// 循环引用报错
const oobj = {
  name: 'loopObj',
};
const loopObj = {
  oobj,
};
// 对象之间形成循环引用，形成闭环
oobj.loopObj = loopObj;
// 封装一个深拷贝的函数
function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}
// 执行深拷贝，抛出错误
// deepClone(oobj);

// BigInt 报错
var c = {
  test: 1n,
};
console.log(JSON.stringify(c));
